<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <script>


        ////////////////////////////////////////////////////////////
        // ES5 实现继承原理
        ////////////////////////////////////////////////////////////

        function A() {
            return "A";
        }

        // console.log(A);
        // console.log(A.prototype);
        // console.log(A.__proto__===Function.prototype);
        // console.log(A.prototype.__proto__===Object.prototype);


        function B() {
            return "B"
        }

        //继承方法1 B继承A 
        Reflect.setPrototypeOf(B, A); // B.__proto__=A
        Reflect.setPrototypeOf(B.prototype, A.prototype);// B.prototype.__proto__=A.prototype
        console.log(B);
        console.log(B.prototype);
        console.log(B.__proto__ === A);
        console.log(B.prototype.__proto__ === A.prototype);
        let b=new B();
        console.log(b.__proto__===B.prototype);


        //继承方法2 D继承C 
        // function C() {
        //     return "C";
        // }

        // function D() {
        //     return "D"
        // }

        // D.__proto__ = Object.create(C).__proto__
        // D.prototype.__proto__ = Object.create(C.prototype).__proto__;
        // console.log(D);
        // console.log(D.prototype);
        // console.log(D.__proto__ === C);
        // console.log(D.prototype.__proto__ === C.prototype);
        // let d = new D();
        // console.log(d.__proto__ === D.prototype);
        // console.log(d.__proto__.__proto__ === (new C).__proto__);

        // //继承方法3 child继承parent 
        // function Parent() {
        //     return "Parent"
        // }
        // Parent.prototype.ParentFun = function () { return "ParentFun" }

        // function Child() {
        //     return "Child"
        // }
        // Child.prototype.ChildFun = function () { return "ChildFun" }

        // Child.__proto__=Object.create(Parent).__proto__;
        // Child.prototype = Object.create(Parent.prototype,{  // Child.prototype.__proto__=Parent.prototype
        //     // 不要忘了重新指定构造函数 这个是必须的
        //     constructor: {                                  //Child.prototype.constructor=constructor
        //         value: Child
        //     },
        //     foo: {                                       //Child.prototype.foo=foo                                     
        //         writable: true,
        //         configurable: true,
        //         value: "hello"
        //     },
        //     ChildFun: {                                  //Child.prototype.ChildFun=ChildFun
        //         value: function () {
        //             return "ChildFun";
        //         }
        //     }
        // });
        // console.log(Child);
        // console.log(Child.__proto__);
        // console.log(Child.prototype);

        // let child = new Child();
        // console.log(child.__proto__ === Child.prototype);
        // console.log(child.__proto__.__proto__ === (new Parent).__proto__);

        //   //继承方法4 child继承parent 
        //   function Parent() {
        //     return "Parent"
        // }
        // Parent.prototype.ParentFun = function () { return "ParentFun" }

        // function Child() {
        //     return "Child"
        // }
        // Child.prototype.ChildFun = function () { return "ChildFun" }

        // Child.__proto__ = Object.create(Parent).__proto__;
        // Child.prototype = Object.create(Parent.prototype);
        // Reflect.defineProperty(Child.prototype, "constructor",{ value: Child});
        // Reflect.defineProperty(Child.prototype, "foo",{ writable: true,
        //         configurable: true,
        //         value: "hello"});
        // Reflect.defineProperty(Child.prototype, "ChildFun",{ value: function () {
        //             return "ChildFun";
        //         }});

        // console.log(Child);
        // console.log(Child.__proto__);
        // console.log(Child.prototype);

        // let child = new Child();
        // console.log(child.__proto__ === Child.prototype);
        // console.log(child.__proto__.__proto__ === (new Parent).__proto__);

        // //继承方法5 child继承parent 
        // function Parent() {
        //     return "Parent"
        // }
        // Parent.prototype.ParentFun = function () { return "ParentFun" }

        // function Child() {
        //     return "Child"
        // }
        // // Child.prototype.ChildFun = function () { return "ChildFun" }

        // Reflect.setPrototypeOf(Child, Parent)
        // Reflect.setPrototypeOf(Child.prototype, Parent.prototype)
        // Reflect.defineProperty(Child.prototype, "constructor", { value: Child });
        // Reflect.defineProperty(Child.prototype, "foo", {
        //     writable: true,
        //     configurable: true,
        //     value: "hello"
        // });
        // Reflect.defineProperty(Child.prototype, "ChildFun", {
        //     value: function () {
        //         return "ChildFun";
        //     }
        // });

        // console.log(Child);
        // console.log(Child.__proto__);
        // console.log(Child.prototype);

        // let child = new Child();
        // console.log(child.__proto__ === Child.prototype);
        // console.log(child.__proto__.__proto__ === (new Parent).__proto__);


        ////////////////////////////////////////////////////////////
        // ES6 实现继承原理（不用extends）
        ////////////////////////////////////////////////////////////
        // class Parent {
        //     constructor(nameParent) {
        //         this.nameParent = nameParent;
        //     }
        //     static funStaticParent() {
        //         return "funStaticParent"
        //     }
        //     funA() {
        //         return "funParent"
        //     }
        // }
        // class Child {
        //     constructor(nameChild) {
        //         this.nameChild = nameChild
        //     }
        //     static funStaticChild() {
        //         return "funStaticChild"
        //     }
        //     funChild() {
        //         return "funChild"
        //     }
        // }

        // // extends ==1+2

        // ////1 实现继承 Child 继承 Parent 的静态属性
        // //Reflect.setPrototypeOf(Child,Parent);
        // // -->>等同
        // //Child.__proto__ = Parent;
        // // -->>等同
        // Child.__proto__ = Object.create(Parent).__proto__;

        // ////2 实现继承 Child 的实例继承 Parent 的实例
        // //  Reflect.setPrototypeOf(Child.prototype,Parent.prototype);//
        // // -->>等同
        // //Child.prototype.__proto__ = Parent.prototype;
        // // -->>等同
        // Child.prototype.__proto__ = Object.create(Parent.prototype).__proto__; // 参考 Object.Create 实现机制
        // // console.log(Child.prototype.__proto__ === Parent.prototype);// true

        // // console.log(Child.__proto__);
        // // console.log(Child.prototype);
        // // // console.log(Parent.prototype);
        // // console.log(Child.prototype.__proto__);


        // // // // Object.Create 实现机制
        // // Object.myCreate2 = function (obj) {

        // //     let emptyObj = {};
        // //     // 但是__proto__在IE下已被禁用，兼容性不好，所以我们要想其他方法
        // //     emptyObj.__proto__ = obj;
        // //     return emptyObj;

        // //     // function fun2() { }
        // //     // fun2.prototype = obj;
        // //     // let tempObj = new fun2();
        // //     // return tempObj;

        // // }

        // // 看下 实例child  child.__proto_==Child.prototype
        // let child = new Child("szq");
        // console.log(child);
        // console.log(child.__proto__ === Child.prototype);// true
        // console.log(child.__proto__.__proto__ === Child.prototype.__proto__);// true
        // console.log(Child.prototype.__proto__ === Parent.prototype);// true
        // console.log(child.__proto__.__proto__ === Parent.prototype);// true
        // console.log(Parent.prototype.__proto__ === Object.prototype);// true
        // console.log(Child.__proto__ === Parent);// true
        // console.log(Parent.__proto__ === Function.prototype);// true







    </script>
</head>

<body>

</body>

</html>